<!DOCTYPE HTML>
<html>

<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>使用 .net core 自定义项目模板 | DeepThought</title>
  <meta name="google-site-verification" content="Ei6mmDdf-cJwox1RvJOeX8Dc720fqWjZQu-Ww2BjBt4">
  
  <meta name="author" content="积慕">
  
  <meta name="description" content=".net,dotnet,core,dotnet core,.netcore,.net core,模板,自定义,自定义模板,template,templateengine,template engine,core template,custom template">
  
  
  <meta name="keywords" content=".net,dotnet,core,dotnet core,.netcore,.net core,模板,自定义,自定义模板,template,templateengine,template engine,core template,custom template">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:title" content="使用 .net core 自定义项目模板">
  <meta property="og:site_name" content="DeepThought">

  
  <meta property="og:image" content>
  

  <link href="https://pic.zhuliang.ltd/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link rel="alternate" href="/atom.xml" title="DeepThought" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">

  <link rel="stylesheet" href="//at.alicdn.com/t/font_1187293_8fec2ou5fyx.css">

  <!-- <link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.6.0/styles/github.min.css"> -->
  <!-- <script src="//cdn.bootcss.com/highlight.js/9.6.0/highlight.min.js"></script> -->
  <script src="/js/highlight.min.js"></script>

  <link rel="stylesheet" href="/css/markdown.css">

  <script src="/js/av-min.3.0.4.js"></script>
  <script src="/js/Valine.min.1.3.6.js"></script>

</head></html>

<body>
  <header id="header" class="inner"><div class="alignleft">
  <h1><a href="/">DeepThought</a></h1>
  <h2><a href="/">知识需沉淀，更需分享</a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/about">关于我</a></li>
    
      <li><a href="/atom.xml">订阅RSS</a></li>
    
  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div>
        </header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper"><article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title">使用 .net core 自定义项目模板</h1>
  


      
        <time datetime="2019-07-28T13:23:59.000Z">
          create: 2019-07-28 21:23:59 | update: 2019-07-28 21:23:59
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        本文总阅读量: <span id="busuanzi_value_page_pv"></span>&nbsp;次
        <span class="blueSeparate">&nbsp;|&nbsp;</span>
        
        <span class="post-count">文章总字数:&nbsp;1.8k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;7&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<p>场景：日常工作中，你可能会碰到需要新建一个全新的解决方案的情况（如公司新起了一个新项目，需要有全新配套的后台程序），如果公司内部基础框架较多、解决方案需要DDD模式等，那么从新起项目到各种依赖引用到能实际可用，一大堆的配置都需要重新设定、测试，耗时耗力，根据项目的大小，往往可能需要 1-2 小时甚至更久。</p>
<p>在 .net core 之前，虽然有相关的解决方法可以实现“项目模板”这个需求，但在具体操作时很不方便，从 .net core 1.0 开始，提供了“模板引擎”，增加了 dotnet new –install（-i） 命令和选项，通过该命令，可以让你方便的创建属于你自己的项目模板。</p>
</blockquote>
<p><strong>通过本文你可以了解和掌握：</strong></p>
<ol>
<li>掌握如何将一个现有解决方案中的项目作为项目模板。<ol>
<li>掌握如何在本地创建项目模板并安装和使用。</li>
<li>掌握如何将本地模板打包成 nuget 包，并通过包 id 进行安装使用该模板。</li>
</ol>
</li>
<li>了解、掌握简单的 dotnet 和 nuget 命令及其配置。（windows 和 mac 会做差异说明）</li>
</ol>
<h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p>本次项目结构如下（DDD）：<br><a id="more"></a></p>
<blockquote>
<p>你可以在我的 github 库：<a href="https://github.com/ArtechChu/Template" target="_blank" rel="noopener">https://github.com/ArtechChu/Template</a> 直接下载该模板源码</p>
</blockquote>
<p><img src="https://pic.zhuliang.ltd/20190728164315.png-c" alt></p>
<ul>
<li>用于发布的项目一共两个，Template.Console 和 Template.WebApi<ul>
<li>其中 Console 项目就是简单的引用了下其他项目进行输出。</li>
<li>WebApi 项目简单配置了下依赖注入，你可以将此项目作为 api 模板项目来说</li>
</ul>
</li>
</ul>
<p>Console 项目概要:</p>
<p><img src="https://pic.zhuliang.ltd/20190728164746.png-c" alt></p>
<p>WebApi 项目概要：</p>
<p><img src="https://pic.zhuliang.ltd/20190728164841.png-c" alt></p>
<h1 id="将本地项目作为本地模板，通过命令进行安装和使用"><a href="#将本地项目作为本地模板，通过命令进行安装和使用" class="headerlink" title="将本地项目作为本地模板，通过命令进行安装和使用"></a>将本地项目作为本地模板，通过命令进行安装和使用</h1><h2 id="1-本次示例以-Console-为例，将控制台项目涉及到的项目拷贝一份到如下文件夹中："><a href="#1-本次示例以-Console-为例，将控制台项目涉及到的项目拷贝一份到如下文件夹中：" class="headerlink" title="1. 本次示例以 Console 为例，将控制台项目涉及到的项目拷贝一份到如下文件夹中："></a>1. 本次示例以 Console 为例，将控制台项目涉及到的项目拷贝一份到如下文件夹中：</h2><pre><code>![](https://pic.zhuliang.ltd/20190728170424.png-c)
</code></pre><h2 id="2-手动创建一个名为“-template-config”的文件夹，并在该文件夹内创建文件：template-json"><a href="#2-手动创建一个名为“-template-config”的文件夹，并在该文件夹内创建文件：template-json" class="headerlink" title="2. 手动创建一个名为“.template.config”的文件夹，并在该文件夹内创建文件：template.json"></a>2. 手动创建一个名为“.template.config”的文件夹，并在该文件夹内创建文件：template.json</h2><p></p><p class="code-caption" data-lang="json" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="json">{
  &quot;$schema&quot;: &quot;http://json.schemastore.org/template&quot;,
  &quot;author&quot;: &quot;Artech&quot;,
  &quot;classifications&quot;: [ &quot;Console&quot; ],
  &quot;name&quot;: &quot;Custom Console&quot;,
  &quot;identity&quot;: &quot;Custom Console&quot;, //模板唯一标识
  &quot;groupIdentity&quot;: &quot;Custom Console&quot;, 
  &quot;shortName&quot;: &quot;CustomConsole&quot;, //【修改】短名称，使用 dotnet new &lt;shortName&gt; 安装模板时的名称
  &quot;tags&quot;: {
    &quot;language&quot;: &quot;C#&quot;, 
    &quot;type&quot;: &quot;project&quot; 
  },
  &quot;sourceName&quot;: &quot;Template&quot;, //【修改】在使用 -n 选项时，会替换模板中项目的名字
  &quot;preferNameDirectory&quot;: true
}
</code></pre>
<ul>
<li>这里主要说明下 shortName 和 sourceName 这 2 个属性。<ul>
<li>shortName：短名称，用于在使用“dotnet new -l”命令时显示，安装时也可直接根据该短名称进行安装。</li>
<li>sourceName：当我们在使用”dotnet new” 命令进行安装时，如果指定了 -n 或者 -o 选项，那么选项后面的名字会自动替换 sourceName 中指定的名字，因为我们的项目命名规则是 “Template.XXXX”，所   这里设定为“Template”，如果你的项目命名规则是“公司.项目.XXX”，那么这里请设定为“公司.项目”。</li>
</ul>
</li>
</ul>
<h2 id="3-安装该模板到本地模板库"><a href="#3-安装该模板到本地模板库" class="headerlink" title="3. 安装该模板到本地模板库"></a>3. 安装该模板到本地模板库</h2><p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh"># 通过如下命令查看当前本机已安装模板：
dotnet  new  -l
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728171127.png-c" alt></p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh"># 模板安装命令：dotnet  new  i &lt;path | nugetId&gt;
# 这里因为是安装本地模板，直接使用路径（绝对和相对均可）
dotnet  new  -i  .
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728171620.png-c" alt></p>
<h2 id="4-安装该短名称为-CustomConsole-的模板"><a href="#4-安装该短名称为-CustomConsole-的模板" class="headerlink" title="4. 安装该短名称为 CustomConsole 的模板"></a>4. 安装该短名称为 CustomConsole 的模板</h2><blockquote>
<p>假定安装路径为 D:\TestTemplate</p>
<p>假定新起的项目名为“Company.Group”</p>
</blockquote>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh"># 这里使用 -n 和 -o 选项来分别指定新项目的名字以及输出目录
# 设定新项目的名字为“Company.Group”，因为当前定位已经在 TestTemplate 文件夹内，所以直接用“.”，如下：
 dotnet   new   CustomConsole   -n   Company.Group   -o   .
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728172203.png-c" alt></p>
<p>文件夹内容如下：</p>
<p><img src="https://pic.zhuliang.ltd/20190728172240.png-c" alt></p>
<ul>
<li>使用模板新建的项目文件夹自动为“Company.Group.XXXX”</li>
</ul>
<p>测试：</p>
<p><img src="https://pic.zhuliang.ltd/20190728172351.png-c" alt></p>
<blockquote>
<p>更多关于 template.json 的说明请参考：<a href="http://json.schemastore.org/template" target="_blank" rel="noopener">http://json.schemastore.org/template</a></p>
<ul>
<li>在 template.json 中，你还可以指定 symbols 等，来实现更多的自定义功能，如联动预编译指令等等。</li>
</ul>
</blockquote>
<h1 id="将本地项目打包为-nuget-包，并通过命令进行安装和使用"><a href="#将本地项目打包为-nuget-包，并通过命令进行安装和使用" class="headerlink" title="将本地项目打包为 nuget 包，并通过命令进行安装和使用"></a>将本地项目打包为 nuget 包，并通过命令进行安装和使用</h1><blockquote>
<p>本次示例以 Console +WebApi 为例，在 Templates\Nuget 文件夹中，建立 Content 文件夹用于存放 nuget 包内容，具体如下：</p>
</blockquote>
<p><img src="https://pic.zhuliang.ltd/20190728204411.png-c" alt></p>
<ul>
<li>ConsoleTemplate 中的  .template.config\template.json 内容同上方 Console 示例。</li>
<li>WebApiTemplate 中的 .template.config\template.json 内容如下：</li>
</ul>
<p></p><p class="code-caption" data-lang="json" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="json">{
  &quot;$schema&quot;: &quot;http://json.schemastore.org/template&quot;,
  &quot;author&quot;: &quot;Artech&quot;,
  &quot;classifications&quot;: [ &quot;WebApi&quot; ],
  &quot;name&quot;: &quot;Custom WebApi&quot;,
  &quot;identity&quot;: &quot;Custom WebApi&quot;,
  &quot;groupIdentity&quot;: &quot;Custom WebApi&quot;,
  &quot;shortName&quot;: &quot;CustomWebApi&quot;,
  &quot;tags&quot;: {
    &quot;language&quot;: &quot;C#&quot;,
    &quot;type&quot;: &quot;project&quot;
  },
  &quot;sourceName&quot;: &quot;Template&quot;,
  &quot;preferNameDirectory&quot;: true
}
</code></pre>
<h2 id="1-在-content-目录内创建一个-nuspec-文件：Custom-Template-NetCore-nuspec，内容如下："><a href="#1-在-content-目录内创建一个-nuspec-文件：Custom-Template-NetCore-nuspec，内容如下：" class="headerlink" title="1. 在 content 目录内创建一个 nuspec 文件：Custom.Template.NetCore.nuspec，内容如下："></a>1. 在 content 目录内创建一个 nuspec 文件：Custom.Template.NetCore.nuspec，内容如下：</h2><p></p><p class="code-caption" data-lang="xml" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd&quot;&gt;
  &lt;metadata&gt;
    &lt;id&gt;Custom.Template.NetCore&lt;/id&gt;
    &lt;version&gt;1.0.1&lt;/version&gt;
    &lt;description&gt;
      Custom Template, including WebApi, Console
    &lt;/description&gt;
    &lt;authors&gt;Artech&lt;/authors&gt;
    &lt;packageTypes&gt;
      &lt;packageType name=&quot;Template&quot; /&gt;
    &lt;/packageTypes&gt;
  &lt;/metadata&gt;
&lt;/package&gt;
</code></pre>
<ul>
<li>需要注意，packageType 为 Template，metadata.id 必须保证唯一，其他按需设置即可。</li>
<li>必须是在 content 文件夹内。nuget 在打包的时候，是根据 content 文件夹来进行的。</li>
</ul>
<h2 id="2-使用-nuget-pack-命令打包"><a href="#2-使用-nuget-pack-命令打包" class="headerlink" title="2. 使用 nuget pack 命令打包"></a>2. 使用 nuget pack 命令打包</h2><p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh"># 注意路径的相对位置
nuget   pack   Custom.Template.NetCore.nuspec   -OutputDirectory   .
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728205751.png-c" alt></p>
<ul>
<li>打包后的内容为：</li>
</ul>
<p><img src="https://pic.zhuliang.ltd/20190728212505.png-c" alt></p>
<h2 id="3-发布该-nuget-包到-nuget-server"><a href="#3-发布该-nuget-包到-nuget-server" class="headerlink" title="3. 发布该 nuget 包到 nuget server"></a>3. 发布该 nuget 包到 nuget server</h2><blockquote>
<p>这里用的是自建 nuget server，你可以按自身情况打包上传。</p>
</blockquote>
<p><img src="https://pic.zhuliang.ltd/20190728212223.png-c" alt></p>
<ul>
<li>你可以直接使用 Nuget Package Explorer 进行发布包</li>
<li>也可以使用 nuget push 来发布，如下：</li>
</ul>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">nuget push Custom.Template.NetCore.1.0.1.nupkg -Source &quot;你的nuget 服务 url&quot; -ApiKey &quot;你的nuget api key&quot;
</code></pre>
<h2 id="4-通过-nuget-安装模板到本地"><a href="#4-通过-nuget-安装模板到本地" class="headerlink" title="4. 通过 nuget 安装模板到本地"></a>4. 通过 nuget 安装模板到本地</h2><ul>
<li>安装前本地已经安装的模板如下：</li>
</ul>
<p><img src="https://pic.zhuliang.ltd/20190728212721.png-c" alt></p>
<ul>
<li>安装</li>
</ul>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">dotnet new -i Custom.Template.NetCore::*
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728212908.png-c" alt></p>
<h2 id="5-通过模板安装-CustomWebApi"><a href="#5-通过模板安装-CustomWebApi" class="headerlink" title="5. 通过模板安装 CustomWebApi"></a>5. 通过模板安装 CustomWebApi</h2><blockquote>
<p>安装路径为：D:\TestWebApiTemplate</p>
</blockquote>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">dotnet  new  CustomWebApi  -n  Company.Group  -o  .
</code></pre>
<h2 id="6-创建一个解决方案，并将所有的项目添加到解决方案-Company-Group-sln-中"><a href="#6-创建一个解决方案，并将所有的项目添加到解决方案-Company-Group-sln-中" class="headerlink" title="6. 创建一个解决方案，并将所有的项目添加到解决方案 Company.Group.sln 中"></a>6. 创建一个解决方案，并将所有的项目添加到解决方案 Company.Group.sln 中</h2><p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">dotnet new sln -n Company.Group
# windows 下无法使用 glob pattern 只能逐个添加
dotnet sln Company.Group.sln add Company.Group.Application\Company.Group.Application.csproj
dotnet sln Company.Group.sln add Company.Group.Domain\Company.Group.Domain.csproj
dotnet sln Company.Group.sln add Company.Group.DomainService\Company.Group.DomainService.csproj
dotnet sln Company.Group.sln add Company.Group.IApplication\Company.Group.IApplication.csproj
dotnet sln Company.Group.sln add Company.Group.IDomainService\Company.Group.IDomainService.csproj
dotnet sln Company.Group.sln add Company.Group.Infrastructure.CrossCutting\Company.Group.Infrastructure.CrossCutting.csproj
dotnet sln Company.Group.sln add Company.Group.Repository\Company.Group.Repository.csproj
dotnet sln Company.Group.sln add Company.Group.WebApi\Company.Group.WebApi.csproj
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728213745.png-c" alt></p>
<p>如果你用的是 mac / linux ，则可以直接用 globbing pattern 来添加，如下：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">dotnet sln Company.Group.sln add **/*.csproj
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20190728214834.png-c" alt></p>
<h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><blockquote>
<ul>
<li><p><a href="https://devblogs.microsoft.com/dotnet/how-to-create-your-own-templates-for-dotnet-new/" target="_blank" rel="noopener">https://devblogs.microsoft.com/dotnet/how-to-create-your-own-templates-for-dotnet-new/</a></p>
</li>
<li><p><a href="https://github.com/dotnet/dotnet-template-samples" target="_blank" rel="noopener">https://github.com/dotnet/dotnet-template-samples</a></p>
</li>
<li><p><a href="https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new?tabs=netcore22" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new?tabs=netcore22</a></p>
</li>
<li><p><a href="https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools</a></p>
</li>
</ul>
</blockquote>

      

      <div>
        
        <div style="background-color: rgb(255, 23, 0);user-select: auto;height: 3px;width:100%;margin-top: 40px;margin-bottom:15px;"></div>

<!-- <p>常言道：学然后知不足，教然后知困。</p>
<p>我知道你的焦虑，一起共进加油：P</p>
<p>关不关注都无所谓，会根据生活节奏紧凑度定期分享些开发经验、搬砖生涯、痛点、感悟。</p>
<p>
        <img src="https://pic.zhuliang.ltd/20191213133908.gif" alt="欢迎关注我的订阅号：P" />
</p> -->
<ul class="post-copyright" style="margin-left:0px;">
    <li class="post-copyright-author">
        <strong>本文作者：</strong>积慕
    </li>
    <li class="post-copyright-link">
        <strong>本文链接：</strong>
        <a href="/2019/07/backend/custom-template-using-dotnetcore.html" title="使用 .net core 自定义项目模板">https://blog.zhuliang.ltd/2019/07/backend/custom-template-using-dotnetcore.html</a>
    </li>
    <li class="post-copyright-license">
        <strong>版权： </strong>
        本站文章均采用 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/" rel="external nofollow"
            target="_blank">CC BY-NC-SA 3.0 CN</a> 许可协议，请勿用于商业，转载注明出处！
    </li>
</ul>
        
      </div>
    </div>

    <footer>
      
      
  
  <div class="categories">
    <a href="/categories/backend/">backend</a>
  </div>

      
  
  <div class="tags">
    <a href="/tags/教程/">教程</a>, <a href="/tags/net-core/">.net core</a>
  </div>

      <!-- 
  <div class="addthis addthis_toolbox addthis_default_style">
    
    
      <a class="addthis_button_tweet"></a>
    
    
      <a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
    
    
      <a class="addthis_button_pinterest_pinit" pi:pinit:layout="horizontal"></a>
    
    <a class="addthis_counter addthis_pill_style"></a>
  </div>
  <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js"></script>
 -->
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!-- 
<section id="comment">
  <h1 class="title">留言</h1>

  <div id="vcomments" style="background-color: #fff"></div>
  <script>
    new Valine({
      el: '#vcomments',
      appId: 'aTPKmG6tjDo3CbIXzAPzrj4X-gzGzoHsz',
      appKey: 'hNgWFneNpEcMnBJclPQnDgsd',
      notify: true,
      verify: true, //验证码
      avatar: 'monsterid', //https://valine.js.org/avatar.html
      placeholder: '请输入你的评论'
    })
  </script>
</section>
 --> <!--启用/关闭 LeanCloud 评论--></div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-category"></i>&nbsp;&nbsp;分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/categories/PowerUser/">PowerUser</a><small>4</small></li>
  
    <li><a href="/categories/backend/">backend</a><small>57</small></li>
  
    <li><a href="/categories/frontend/">frontend</a><small>9</small></li>
  
    <li><a href="/categories/operations/">operations</a><small>5</small></li>
  
    <li><a href="/categories/提前退休/">提前退休</a><small>2</small></li>
  
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-new3"></i>&nbsp;&nbsp;最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2024/11/PowerUser/install-docker-in-pve-lxc.html">1. 通过 PVE LXC 搭建 docker 环境</a>
      </li>
    
      <li>
        <a href="/2024/11/Obsidian/obsidian-render-pie-chart.html">2. 2 套用于 obsidian 的生成时间占用饼图脚本示例，基于 templater， charts，echarts+dataview</a>
      </li>
    
      <li>
        <a href="/2024/10/PowerUser/fix-ios18-samba-readonly-issue.html">3. 解决 ios 18（包括ipadOS 18） 下通过文件(files app)连接 samba 服务器，目录变成只读权限的问题</a>
      </li>
    
      <li>
        <a href="/2023/07/operations/how-to-use-pm2.html">4. PM2 的安装、配置和使用</a>
      </li>
    
      <li>
        <a href="/2023/07/backend/expose-intranet-netcoreapi-to-internet.html">5. 通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中</a>
      </li>
    
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-tag"></i>&nbsp;&nbsp;标签</h3>
  <ul class="entry">
  
    <li><a href="/tags/net-core/">.net core</a><small>12</small></li>
  
    <li><a href="/tags/Debian/">Debian</a><small>2</small></li>
  
    <li><a href="/tags/Docker/">Docker</a><small>1</small></li>
  
    <li><a href="/tags/Elasticsearch/">Elasticsearch</a><small>35</small></li>
  
    <li><a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a><small>35</small></li>
  
    <li><a href="/tags/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/tags/PVE/">PVE</a><small>2</small></li>
  
    <li><a href="/tags/StackExchange-Redis系列/">StackExchange.Redis系列</a><small>12</small></li>
  
    <li><a href="/tags/centos/">centos</a><small>3</small></li>
  
    <li><a href="/tags/flex/">flex</a><small>1</small></li>
  
    <li><a href="/tags/ios/">ios</a><small>1</small></li>
  
    <li><a href="/tags/javascript/">javascript</a><small>1</small></li>
  
    <li><a href="/tags/linux/">linux</a><small>4</small></li>
  
    <li><a href="/tags/nginx/">nginx</a><small>2</small></li>
  
    <li><a href="/tags/nuget/">nuget</a><small>2</small></li>
  
    <li><a href="/tags/react/">react</a><small>6</small></li>
  
    <li><a href="/tags/styled-components/">styled-components</a><small>1</small></li>
  
    <li><a href="/tags/内网穿透/">内网穿透</a><small>4</small></li>
  
    <li><a href="/tags/培训讲义/">培训讲义</a><small>2</small></li>
  
    <li><a href="/tags/基础知识/">基础知识</a><small>2</small></li>
  
    <li><a href="/tags/性能优化/">性能优化</a><small>2</small></li>
  
    <li><a href="/tags/教程/">教程</a><small>64</small></li>
  
    <li><a href="/tags/理财/">理财</a><small>2</small></li>
  
    <li><a href="/tags/生命周期/">生命周期</a><small>1</small></li>
  
    <li><a href="/tags/经验/">经验</a><small>4</small></li>
  
  </ul>
</div>


  
  <script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
  <script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
  <div class="widget tag">
    <h3 class="title"><i class="iconfont icon-cloud1"></i>&nbsp;&nbsp;标签云</h3>
    <div id="myCanvasContainer" class="widget tagcloud">
      <canvas width="250" height="250" id="resCanvas" style="width:100%">
        <a href="/tags/net-core/" style="font-size: 17.14px;">.net core</a> <a href="/tags/Debian/" style="font-size: 11.43px;">Debian</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/Elasticsearch/" style="font-size: 18.57px;">Elasticsearch</a> <a href="/tags/Elasticsearch-Nest系列/" style="font-size: 18.57px;">Elasticsearch.Nest系列</a> <a href="/tags/Obsidian/" style="font-size: 10px;">Obsidian</a> <a href="/tags/PVE/" style="font-size: 11.43px;">PVE</a> <a href="/tags/StackExchange-Redis系列/" style="font-size: 17.14px;">StackExchange.Redis系列</a> <a href="/tags/centos/" style="font-size: 12.86px;">centos</a> <a href="/tags/flex/" style="font-size: 10px;">flex</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/linux/" style="font-size: 14.29px;">linux</a> <a href="/tags/nginx/" style="font-size: 11.43px;">nginx</a> <a href="/tags/nuget/" style="font-size: 11.43px;">nuget</a> <a href="/tags/react/" style="font-size: 15.71px;">react</a> <a href="/tags/styled-components/" style="font-size: 10px;">styled-components</a> <a href="/tags/内网穿透/" style="font-size: 14.29px;">内网穿透</a> <a href="/tags/培训讲义/" style="font-size: 11.43px;">培训讲义</a> <a href="/tags/基础知识/" style="font-size: 11.43px;">基础知识</a> <a href="/tags/性能优化/" style="font-size: 11.43px;">性能优化</a> <a href="/tags/教程/" style="font-size: 20px;">教程</a> <a href="/tags/理财/" style="font-size: 11.43px;">理财</a> <a href="/tags/生命周期/" style="font-size: 10px;">生命周期</a> <a href="/tags/经验/" style="font-size: 14.29px;">经验</a>
      </canvas>
    </div>
  </div>




</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">

  
  &copy; 2018 - 2024 &nbsp;<a href='/about'>积慕</a>
  
  &nbsp;&nbsp;<a href='https://www.cnblogs.com/deepthought/'>我的博客园地址</a>
  &nbsp;&nbsp;finalclassic#outlook.com
</div>

<div class="clearfix"></div>
<div>
  本站主题基于：<a href='https://github.com/hexojs/hexo-theme-light' rel="external nofollow">hexo-theme-light</a>
</div>
<div id="busuanzi_container_site_pv">
  本站总访问量&nbsp;<span id="busuanzi_value_site_pv"></span>&nbsp;次
</div>
<div style="width:300px;margin:0 auto; padding:20px 0;">
  <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011702004805" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
    <img src="https://pic.zhuliang.ltd/20200102164648.png" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">沪公网安备 31011702004805号</p></a>
</div></footer>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<script type="text/javascript">
hljs.initHighlightingOnLoad();
</script>

<!-- <script src="/js/busuanzi.pure.mini.js"></script> -->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script>
    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ea793b9c8d6b31df666a6bc15038e246";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
</body>
</html>
